﻿using Aliyun.Acs.afs.Model.V20180112;
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Profile;
using Common.Core.Common;
using Common.Core.DTO;

namespace Common.Core.Helpers
{
    /// <summary>
    /// 阿里云助手 滑动验证码
    /// </summary>
    public class AliyunAFSHelper
    {
        static String regionid = "cn-hangzhou";
        static String accessKeyId = Configs.GetConfigurationValue("AliyunAFS", "Ali_AFS_AccessKeyID").ToString();
        static String accessKeySecret = Configs.GetConfigurationValue("AliyunAFS", "Ali_AFS_AccessKeySecret").ToString();
        // Create a new IClientProfile instance
        static IAcsClient client = null;
        static AliyunAFSHelper()
        {
            IClientProfile profile = DefaultProfile.GetProfile(regionid, accessKeyId, accessKeySecret);
            client = new DefaultAcsClient(profile);
            profile.AddEndpoint("cn-hangzhou", "cn-hangzhou", "afs", "afs.aliyuncs.com");
        }
        /// <summary>
        /// 获取阿里云滑动验证码出参
        /// </summary>
        public class GetAliAFSResponseDTO
        {
            /// <summary>
            /// code
            /// </summary>
            public int Code { get; set; }
            /// <summary>
            /// Msg
            /// </summary>
            public string Msg { get; set; }
            /// <summary>
            /// Detail
            /// </summary>
            public string Detail { get; set; }
        }

        /// <summary>
        /// 阿里云 验证码 测试接口
        /// </summary>
        public class ALiAFSArgs : BaseArgs
        {
            /// <summary>
            /// 会话ID。必填参数，从前端获取，不可更改。
            /// </summary>
            public string SessionId { get; set; }
            /// <summary>
            /// 签名串。必填参数，从前端获取，不可更改。
            /// </summary>
            public string Sig { get; set; }
            /// <summary>
            /// 请求唯一标识。必填参数，从前端获取，不可更改。
            /// </summary>
            public string Token { get; set; }
            /// <summary>
            /// 场景标识。必填参数，从前端获取，不可更改。
            /// </summary>
            public string Scene { get; set; }
            /// <summary>
            /// appkey
            /// </summary>
            public string AppKey { get; set; }
            /// <summary>
            /// 客户端IP。必填参数，后端填写。
            /// </summary>
            public string RemoteIp { get; set; }
        }
        /// <summary>
        /// 请求阿里云滑动验证码
        /// </summary>
        /// <param name="args"></param>
        /// <returns></returns>
        public static AuthenticateSigResponse GetAliAFSResponse(ALiAFSArgs args)
        {
            AuthenticateSigResponse response = new AuthenticateSigResponse();
            if (args != null)
            {
                if (client != null)
                {
                    AuthenticateSigRequest request = new AuthenticateSigRequest();
                    request.SessionId = args.SessionId;// 会话ID。必填参数，从前端获取，不可更改。
                    request.Sig = args.Sig;// 签名串。必填参数，从前端获取，不可更改。
                    request.Token = args.Token;// 请求唯一标识。必填参数，从前端获取，不可更改。
                    request.Scene = args.Scene;// 场景标识。必填参数，从前端获取，不可更改。
                    request.AppKey = args.AppKey;// 应用类型标识。必填参数，后端填写。
                    request.RemoteIp = args.RemoteIp;// 客户端IP。必填参数，后端填写。
                    AuthenticateSigResponse aliresponse = client.GetAcsResponse(request);
                    return aliresponse;
                }
                else
                {
                    //重新初始化
                    IClientProfile profile = DefaultProfile.GetProfile(regionid, accessKeyId, accessKeySecret);
                    client = new DefaultAcsClient(profile);
                    profile.AddEndpoint("cn-hangzhou", "cn-hangzhou", "afs", "afs.aliyuncs.com");
                    AuthenticateSigRequest request = new AuthenticateSigRequest();
                    request.SessionId = args.SessionId;// 会话ID。必填参数，从前端获取，不可更改。
                    request.Sig = args.Sig;// 签名串。必填参数，从前端获取，不可更改。
                    request.Token = args.Token;// 请求唯一标识。必填参数，从前端获取，不可更改。
                    request.Scene = args.Scene;// 场景标识。必填参数，从前端获取，不可更改。
                    request.AppKey = args.AppKey;// 应用类型标识。必填参数，后端填写。
                    request.RemoteIp = args.RemoteIp;// 客户端IP。必填参数，后端填写。
                    AuthenticateSigResponse aliresponse = client.GetAcsResponse(request);
                    return aliresponse;
                }
            }
            else
            {
                response.Code = 0;
                response.Msg = "入参不能为空";
                return response;
            }
        }
    }
}
